#include <bits/stdc++.h>
using namespace std;

#define MAX_N 100 // 最多的节点数目

int parent[MAX_N]; // 存储每个节点的父节点的表
int deep[MAX_N];   // 存储每个节点的秩，即路径深度

// 初始化并查集，使得每个节点的父节点都是自身
void init(int n)
{
    for(int i=0; i<n; i++)
        parent[i] = i;
}

// 返回指定元素ele所在集合的根节点的下标
int find(int ele)
{
    // 开始的时候，让根节点等于自身
    // 因为肯定是从自身开始去找根节点
    int pos_root = ele;

    // 如果当前位置的父节点不等于-1
    // 则意味着还有上一级的父节点
    // 于是顺藤摸瓜，不断地去找父节点直到遇到-1
    while(parent[pos_root] != pos_root)
        pos_root = parent[pos_root];

    // 返回父节点为自身的节点，这个节点就是根节点
    return pos_root;
}

// 试图将两个元素x和y合并起来
// 如果本身它们已经在同一个集合中，那么返回false失败
// 如果不在一个集合，那么让其中一个成为另一个的父节点
bool merge(int x, int y)
{
    // 判定它们是否在同一个集合
    int x_root = find(x);
    int y_root = find(y);

    // 本在在一起，无需融合
    if(x_root == y_root)
        return false;

    // 不在一个集合，则将y融入x的集合
    parent[y_root] = x_root;
    return true;
}


int main(int argc, char const *argv[])
{
    // 输入给定的一个图
    // n个节点，n条边
    int n, m;
    cin >> n >> m;

    // 初始化并查集
    init(n);

    // 读入m条边，并逐个将他们合并
    for(int i=0; i<m; i++)
    {
        int x, y;
        cin >> x >> y;

        if(merge(x, y) == false)
        {
            cout << "有环！" << endl;
            exit(0);
        }
    }

    cout << "没有环！" << endl;

    return 0;
}
